feat(flask): Add span streaming support and request body capture#6264
feat(flask): Add span streaming support and request body capture#6264ericapisani wants to merge 3 commits into
Conversation
Add request body data to the streaming segment span when span streaming is enabled. Update existing tests to cover both streaming and non-streaming code paths, and add new tests for request body capture, size limits, and header scrubbing in streaming mode. Fixes PY-2323 Fixes #6021
|
bugbot run |
|
@sentry review |
Codecov Results 📊✅ 282 passed | Total: 282 | Pass Rate: 100% | Execution Time: 42.30s 📊 Comparison with Base Branch
✨ No test changes detected All tests are passing successfully. ❌ Patch coverage is 13.89%. Project has 14795 uncovered lines. Files with missing lines (3)
Coverage diff@@ Coverage Diff @@
## main #PR +/-##
==========================================
+ Coverage 28.45% 33.58% +5.13%
==========================================
Files 190 190 —
Lines 22250 22275 +25
Branches 7534 7544 +10
==========================================
+ Hits 6330 7480 +1150
- Misses 15920 14795 -1125
- Partials 606 747 +141Generated by Codecov Action |
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes and found 1 potential issue.
❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.
Reviewed by Cursor Bugbot for commit c74acb1. Configure here.
| extractor = FlaskRequestExtractor(request) | ||
|
|
||
| if not request_body_within_bounds(client, content_length): | ||
| data = AnnotatedValue.substituted_because_over_size_limit() |
There was a problem hiding this comment.
This general logic mostly follows what happens with the request extractor, but Instead of removing the string entirely, it substitutes it with a value to explain why a value was removed, as opposed to providing only an empty string.
alexander-alderman-webb
left a comment
There was a problem hiding this comment.
I just looked at the request body attribute since I'm solving this in Starlette right now, and the same problem applies here 😅
| client = sentry_sdk.get_client() | ||
| if has_span_streaming_enabled(client.options): | ||
| _set_request_body_data_on_streaming_segment(request, client) |
There was a problem hiding this comment.
There are issues with eagerly consuming the request body when the user also tries to consume the raw stream in their handler. My flask route defined in
from flask import Flask, request
import sentry_sdk
app = Flask(__name__)
sentry_sdk.init(
dsn="...",
debug=True,
traces_sample_rate=1.0,
_experiments = {
"trace_lifecycle": "stream",
}
)
@app.post("/raw-wsgi")
def raw_wsgi():
content_length = request.environ.get("CONTENT_LENGTH")
body = request.environ["wsgi.input"].read()
return {
"size": len(body),
"body": body.decode("utf-8", errors="replace"),
}
if __name__ == "__main__":
app.run(port=5000, debug=True)hangs when I run
curl -X POST http://127.0.0.1:5000/raw-wsgi \
-H 'Content-Type: text/plain' \
--data-binary 'hello from curl'
Add span streaming support to the Flask integration. When span streaming is enabled via
_experiments={"trace_lifecycle": "stream"}, the integration now captures request body data as an attribute on the segment span.The request body handling respects existing size limits and content type rules — oversized bodies get the substitution marker, unparseable raw data gets annotated accordingly (different from what we do today where we remove the value entirely).
Fixes PY-2323
Fixes #6021